# 在Class内部，可以有属性和方法，而外部代码可以通过直接调用示例变量的方法来操作数据，这样，就隐藏了内部的复杂逻辑
# 但是，从前面Student类的定义来看，外部代码还是可以自由修改一个类的name、score的属性：

# 如果要让内部属性不被外部访问，可以把属性的名称前面加上两个下划线__，在Python中，实例的变量名如果以__开头，就变成了一个私有变量（private），只有内部可以访问，外部不能访问
class Student(object):
    def __init__(self, name, score):
        self.__name = name
        self.__score = score
    def print_score(self):
        print('%s: %s' % (self.__name, self.__score))

    def set_score(self, score):
        self.__score = score
stu = Student('Bob', 59)
# print(stu.__name) // 会报错：AttributeError: 'Student' object has no attribute '__name'
stu.print_score()

# 修改分数的话，可以给类定义修改分数的方法
stu.set_score(99)
stu.print_score()

# 双下划线开头的实例变量是不是一定不能从外部访问呢？其实也不是。不能直接访问__name是因为Python解释器对外把__name变量改成了_Student__name，所以，
# 仍然可以通过_Student__name来访问__name变量：
# 所以，一切全靠自觉
print(stu._Student__name)
